/**
 * 图片处理工具类
 */

// 支持的图片类型
export const SUPPORTED_IMAGE_TYPES = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp']

// 最大文件大小（5MB）
export const MAX_FILE_SIZE = 5 * 1024 * 1024

/**
 * 检查文件是否为图片
 */
export function isImageFile(file: File): boolean {
  return SUPPORTED_IMAGE_TYPES.includes(file.type)
}

/**
 * 检查文件大小是否符合要求
 */
export function isFileSizeValid(file: File, maxSizeMB: number = 5): boolean {
  return file.size <= maxSizeMB * 1024 * 1024
}

/**
 * 格式化文件大小
 */
export function formatFileSize(bytes: number): string {
  if (bytes === 0) return '0 Bytes'
  
  const k = 1024
  const sizes = ['Bytes', 'KB', 'MB', 'GB']
  const i = Math.floor(Math.log(bytes) / Math.log(k))
  
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
}

/**
 * 从剪贴板获取图片文件
 */
export function getImageFromClipboard(event: ClipboardEvent): File[] {
  const items = event.clipboardData?.items
  if (!items) return []
  
  const imageFiles: File[] = []
  
  for (let i = 0; i < items.length; i++) {
    const item = items[i]
    if (item.type.startsWith('image/')) {
      const file = item.getAsFile()
      if (file) {
        imageFiles.push(file)
      }
    }
  }
  
  return imageFiles
}

/**
 * 生成Markdown图片语法
 */
export function generateImageMarkdown(fileName: string, imageUrl: string): string {
  // 移除文件扩展名作为alt文本
  const altText = fileName.replace(/\.[^/.]+$/, '')
  return `![${altText}](${imageUrl})`
}

/**
 * 在textarea指定位置插入文本
 */
export function insertTextAtCursor(textarea: HTMLTextAreaElement, text: string): void {
  const startPos = textarea.selectionStart
  const endPos = textarea.selectionEnd
  const scrollTop = textarea.scrollTop
  
  // 获取当前文本内容
  const currentValue = textarea.value
  
  // 在光标位置插入新文本
  const newValue = currentValue.substring(0, startPos) + text + currentValue.substring(endPos)
  
  // 更新textarea内容
  textarea.value = newValue
  
  // 恢复光标位置
  textarea.focus()
  textarea.setSelectionRange(startPos + text.length, startPos + text.length)
  
  // 恢复滚动位置
  textarea.scrollTop = scrollTop
  
  // 触发input事件，确保Vue响应式更新
  textarea.dispatchEvent(new Event('input', { bubbles: true }))
}

/**
 * 压缩图片（可选功能，暂时不实现）
 */
export function compressImage(file: File, maxWidth: number = 1920, quality: number = 0.8): Promise<File> {
  return new Promise((resolve, reject) => {
    const canvas = document.createElement('canvas')
    const ctx = canvas.getContext('2d')
    const img = new Image()
    
    img.onload = () => {
      // 计算压缩后的尺寸
      let { width, height } = img
      if (width > maxWidth) {
        height = (height * maxWidth) / width
        width = maxWidth
      }
      
      // 设置canvas尺寸
      canvas.width = width
      canvas.height = height
      
      // 绘制压缩后的图片
      ctx?.drawImage(img, 0, 0, width, height)
      
      // 转换为Blob
      canvas.toBlob(
        (blob) => {
          if (blob) {
            // 创建新的File对象
            const compressedFile = new File([blob], file.name, {
              type: file.type,
              lastModified: Date.now()
            })
            resolve(compressedFile)
          } else {
            reject(new Error('图片压缩失败'))
          }
        },
        file.type,
        quality
      )
    }
    
    img.onerror = () => reject(new Error('图片加载失败'))
    img.src = URL.createObjectURL(file)
  })
}